home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2000 Spring
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin
/
F2JW
/
trans
/
load.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-31
|
19KB
|
719 lines
//
// f2j 辞書をファイルからロードする
//
#include "stdafx.h"
#include <string.h>
#include <ctype.h>
#include "f2j.h"
#include "myprot.h"
extern char *tokenPtr;
extern NOUN *nounTable;
extern ADJECTIVE *adjectiveTable;
extern ADVERB *adverbTable;
char inputBuff[300];
//
// 名詞辞書をload
//
void
LoadNounTable(char *fn)
{
FILE *fp;
NOUN *noun;
fp = fopen(fn, "rt");
if((int )fp <= 0) {
PrintInternalError( "Can not open <%s>\nThis file must be in the same direcotry.", fn);
exit(-1);
} else {
while(TRUE) {
fgets(inputBuff, sizeof(inputBuff), fp);
if(feof(fp)) break;
tokenPtr = inputBuff;
noun = GetNounWord();
SetNounWord(noun);
}
}
fclose(fp);
}
//
//
//
NOUN
*GetNounWord(void )
{
FR_PART dummyFrPart;
JP_KIND dummyJpKind;
FR_LOCATION dummyLocation;
JP_UNIT dummyUnit;
int i;
NOUN *noun = (NOUN *)MyAlloc(sizeof(NOUN));
noun->left = noun->right = NULL;
noun->frAttrib = FR_ATTRIB_NONE;
noun->frChange = FR_CHANGE_NONE;
noun->french = NewString();
// GetFrInfo(&(noun->frAttrib), &(noun->frChange));
noun->proposed = CountComma(tokenPtr)/4+1;
noun->jpNoun = (JP_NOUN *)MyAlloc(sizeof(JP_NOUN) * noun->proposed);
for(i = 0; i < noun->proposed; i++) {
GetFrInfo(&(noun->jpNoun[i].frAttrib),
&(noun->jpNoun[i].frChange));
if(noun->jpNoun[i].frAttrib == FR_ATTRIB_NONE) {
// 指定無し
if(i == 0) {
// デフォルトの設定
noun->jpNoun[i].frAttrib = FR_ATTRIB_MALE;
noun->jpNoun[i].frChange = FR_CHANGE_PLURAL;
} else {
// 前の候補の設定
noun->jpNoun[i].frAttrib = noun->jpNoun[i-1].frAttrib;
noun->jpNoun[i].frChange = noun->jpNoun[i-1].frChange;
}
}
if(noun->jpNoun[i].frChange & FR_CHANGE_PLURAL) {
FR_CHANGE frChange = GetPluralType(noun->french);
if(frChange == FR_CHANGE_NONE) { // 単複同形名詞
noun->jpNoun[i].frAttrib = (FR_ATTRIB)(noun->jpNoun[i].frAttrib | FR_ATTRIB_SINGLE | FR_ATTRIB_PLURAL);
} else {
noun->jpNoun[i].frChange = (FR_CHANGE)(noun->jpNoun[i].frChange | frChange);
}
}
noun->frAttrib = (FR_ATTRIB)(noun->frAttrib | noun->jpNoun[i].frAttrib);
noun->frChange = (FR_CHANGE)(noun->frChange | noun->jpNoun[i].frChange);
noun->jpNoun[i].cFrPart = FR_PART_NONE;
noun->jpNoun[i].cJpProp = JP_PROP_NONE;
GetJpInfo(&(noun->jpNoun[i].cFrPart),
&(noun->jpNoun[i].cJpProp),
&dummyJpKind,
&dummyUnit,
&dummyLocation);
if(noun->jpNoun[i].cFrPart != FR_PART_NONE
&& noun->jpNoun[i].cJpProp == JP_PROP_NONE)
noun->jpNoun[i].cJpProp = JP_PROP_ALL;
noun->jpNoun[i].japanese = NewString();
noun->jpNoun[i].jpProp = JP_PROP_NONE;
noun->jpNoun[i].jpUnit = JP_UNIT_NONE;
GetJpInfo(&dummyFrPart,
&(noun->jpNoun[i].jpProp),
&dummyJpKind,
&(noun->jpNoun[i].jpUnit),
&dummyLocation);
}
// default settings <事柄>
i--;
if(!(noun->jpNoun[i].jpProp
& (JP_PROP_ACTION | JP_PROP_CONDITION | JP_PROP_HUMAN
| JP_PROP_PLACE | JP_PROP_QUESTION | JP_PROP_TIME
| JP_PROP_UNIT))) {
noun->jpNoun[i].jpProp = (JP_PROP)(noun->jpNoun[i].jpProp | JP_PROP_THING);
}
return(noun);
}
//
// 名詞を新しい辞書に追加
//
void
SetNounWord(NOUN *newNoun)
{
if(nounTable == NULL) { // 最初の単語
nounTable = newNoun;
return;
}
tokenPtr = newNoun->french;
NOUN *p = nounTable;
while(p) {
CMP_WORD cmp = CompareNoun(p->french, FR_CHANGE_NONE);
if(cmp & CMP_WORD_LEFT) {
if(p->left) { p = p->left; continue; }
else { p->left = newNoun; break; }
} else if(cmp & CMP_WORD_RIGHT){
if(p->right){ p = p->right; continue; }
else { p->right = newNoun; break; }
} else {
// PrintInternalError( "Multiple Definition on <%s> in f2j_noun.dic\n", newNoun->french);
}
}
}
JP_UNIT_INFO jpUnitInforTable[] =
{ JP_UNIT_INFO( "行", JP_PROP_ACTION, JP_UNIT_NONE ), // 行動
JP_UNIT_INFO( "状", JP_PROP_CONDITION, JP_UNIT_NONE ), // 状態
JP_UNIT_INFO( "人", JP_PROP_HUMAN, JP_UNIT_HITO ),
JP_UNIT_INFO( "場", JP_PROP_PLACE, JP_UNIT_NONE ),
JP_UNIT_INFO( "物", JP_PROP_THING, JP_UNIT_NONE ),
JP_UNIT_INFO( "抽", JP_PROP_ABSTRACT, JP_UNIT_NONE ),
JP_UNIT_INFO( "時", JP_PROP_TIME, JP_UNIT_NONE ),
JP_UNIT_INFO( "固", JP_PROP_UNIQUE, JP_UNIT_NONE ),
JP_UNIT_INFO( "量", JP_PROP_VOLUME, JP_UNIT_NONE ),
JP_UNIT_INFO( "衣", JP_PROP_CLOTH, JP_UNIT_CHAKU ),
JP_UNIT_INFO( "食", JP_PROP_FOOD, JP_UNIT_NONE ),
JP_UNIT_INFO( "飲", JP_PROP_DRINK, JP_UNIT_NONE ),
JP_UNIT_INFO( "乗", JP_PROP_VEHICLE, JP_UNIT_NONE ),
JP_UNIT_INFO( "音", JP_PROP_SOUND, JP_UNIT_NONE ),
JP_UNIT_INFO( "勉", JP_PROP_STUDY, JP_UNIT_NONE ),
JP_UNIT_INFO( "敬", JP_PROP_TITLE, JP_UNIT_NONE ),
JP_UNIT_INFO( "姓", JP_PROP_FAMILY, JP_UNIT_HITO ),
JP_UNIT_INFO( "材", JP_PROP_MATERIAL, JP_UNIT_NONE ),
JP_UNIT_INFO( "天", JP_PROP_WEATHER, JP_UNIT_NONE ),
JP_UNIT_INFO( "台", JP_PROP_NONE, JP_UNIT_DAI ),
JP_UNIT_INFO( "本", JP_PROP_NONE, JP_UNIT_HON ),
JP_UNIT_INFO( "つ", JP_PROP_NONE, JP_UNIT_TSU ),
JP_UNIT_INFO( "個", JP_PROP_NONE, JP_UNIT_KO ),
JP_UNIT_INFO( "冊", JP_PROP_NONE, JP_UNIT_SATU ),
JP_UNIT_INFO( "匹", JP_PROP_NONE, JP_UNIT_HIKI ),
JP_UNIT_INFO( "頭", JP_PROP_NONE, JP_UNIT_TOU ),
JP_UNIT_INFO( "羽", JP_PROP_NONE, JP_UNIT_WA ),
JP_UNIT_INFO( "単", JP_PROP_UNIT, JP_UNIT_UNIT ), // 単位 metre, gramme, franc, ...
JP_UNIT_INFO( "枚", JP_PROP_NONE, JP_UNIT_MAI ),
JP_UNIT_INFO( "日", JP_PROP_DATE, JP_UNIT_NONE ),
JP_UNIT_INFO( "感", JP_PROP_EMOTION, JP_UNIT_NONE ),
JP_UNIT_INFO( "体", JP_PROP_BODY, JP_UNIT_NONE ),
JP_UNIT_INFO( "植", JP_PROP_PLANT, JP_UNIT_HON ),
JP_UNIT_INFO( "部", JP_PROP_PARTIAL, JP_UNIT_NONE ),
JP_UNIT_INFO( "問", JP_PROP_QUESTION, JP_UNIT_NONE ),
JP_UNIT_INFO( "否", JP_PROP_NEGATIVE, JP_UNIT_NONE ),
JP_UNIT_INFO( "受", JP_PROP_PASSIVE, JP_UNIT_NONE ),
JP_UNIT_INFO( "", JP_PROP_NONE, JP_UNIT_NONE ),
};
JP_KIND_INFO jpKindInfoTable[] =
{
{ "う", JP_KIND_GODAN },
{ "く", JP_KIND_GODAN_KA },
{ "す", JP_KIND_GODAN_SA },
{ "つ", JP_KIND_GODAN_TA },
{ "ぬ", JP_KIND_GODAN_NA },
{ "ふ", JP_KIND_GODAN_HA },
{ "む", JP_KIND_GODAN_MA },
// { "う", JP_KIND_GODAN_YA },
{ "る", JP_KIND_GODAN_RA },
// { "う", JP_KIND_GODAN_WA },
{ "ぐ", JP_KIND_GODAN_GA },
{ "ず", JP_KIND_GODAN_ZA },
{ "づ", JP_KIND_GODAN_DA },
{ "ぶ", JP_KIND_GODAN_BA },
{ "い", JP_KIND_IRU },
{ "き", JP_KIND_KIRU },
{ "し", JP_KIND_SIRU },
{ "ち", JP_KIND_TIRU },
{ "に", JP_KIND_NIRU },
{ "ひ", JP_KIND_HIRU },
{ "み", JP_KIND_MIRU },
// { "い", JP_KIND_YIRU },
{ "り", JP_KIND_RIRU },
// { "い", JP_KIND_WIRU },
{ "ぎ", JP_KIND_GIRU },
{ "じ", JP_KIND_ZIRU },
{ "ぢ", JP_KIND_DIRU },
{ "び", JP_KIND_BIRU },
{ "え", JP_KIND_ERU },
{ "け", JP_KIND_KERU },
{ "せ", JP_KIND_SERU },
{ "て", JP_KIND_TERU },
{ "ね", JP_KIND_NERU },
{ "へ", JP_KIND_HERU },
{ "め", JP_KIND_MERU },
// { "え", JP_KIND_YERU },
{ "れ", JP_KIND_RERU },
// { "え", JP_KIND_WERU },
{ "げ", JP_KIND_GERU },
{ "ぜ", JP_KIND_ZERU },
{ "で", JP_KIND_DERU },
{ "べ", JP_KIND_BERU },
{ "だ", JP_KIND_DA },
{ "カ", JP_KIND_KAHEN },
{ "サ", JP_KIND_SAHEN },
{ "シ", JP_KIND_SAHEN2 },
{ "形", JP_KIND_KEIYOSHI },
{ "動", JP_KIND_KEIYODOSHI },
{ "連", JP_KIND_RENTAISHI },
{ "副", JP_KIND_ADVERB },
{ "", JP_KIND_NONE } // End Mark
};
//
// 日本語訳の情報を得る
//
void
GetJpInfo(FR_PART *frPart, JP_PROP *jpProp, JP_KIND *jpKind, JP_UNIT *jpUnit, FR_LOCATION *location)
{
while(TRUE) {
if(Amatch(",") || *tokenPtr == '\n' || *tokenPtr == '\0') {
break;
} else if(Amatch("AI")) {
*frPart = FR_PART_PREPOSIT_A_INF;
} else if(Amatch("<@>")) {
*frPart = FR_PART_PREPOSIT_A;
} else if(Amatch("<avec>")) {
*frPart = FR_PART_PREPOSIT_AVEC;
} else if(Amatch("DI")) {
*frPart = FR_PART_PREPOSIT_DE_INF;
} else if(Amatch("<de>")) {
*frPart = FR_PART_PREPOSIT_DE;
} else if(Amatch("PI")) {
*frPart = FR_PART_PREPOSIT_POUR_INF;
} else if(Amatch("<pour>")) {
*frPart = FR_PART_PREPOSIT_POUR;
} else if(Amatch("<que>")) {
*frPart = FR_PART_SENTENCE_QUE;
/* } else if(Amatch("K")) {
*jpKind = (JP_KIND)(*jpKind | JP_KIND_KEIYOSHI);
} else if(Amatch("D")) {
*jpKind = (JP_KIND)(*jpKind | JP_KIND_KEIYODOSHI);
} else if(Amatch("M")) {
*jpKind = (JP_KIND)(*jpKind | JP_KIND_KEIYODOSHI2);
*/ } else if(Amatch("B")) {
*location = (FR_LOCATION)(*location & ~(FR_LOCATION_BEHIND));
*location = (FR_LOCATION)(*location | FR_LOCATION_FRONT);
} else {
BOOL hit = FALSE;
for(JP_UNIT_INFO *q = jpUnitInforTable; *(q->cmd); q++) {
if(Amatch((char *)q->cmd)) {
*jpProp |= q->jpProp;
*jpUnit = (JP_UNIT)(*jpUnit | q->jpUnit);
hit = TRUE;
}
}
for(JP_KIND_INFO *r = jpKindInfoTable; *(r->cmd); r++) {
if(Amatch((char *)r->cmd)) {
*jpKind = r->jpKind;
hit = TRUE;
}
}
if(hit == FALSE) {
SyntaxError();
return;
}
}
}
}
//
// フランス語の情報を得る
//
void
GetFrInfo(FR_ATTRIB *frAttrib, FR_CHANGE *frChange)
{
*frAttrib = FR_ATTRIB_NONE;
// 規則変化で女性形・複数形が作れる
*frChange = (FR_CHANGE)(FR_CHANGE_FEMALE | FR_CHANGE_PLURAL);
while(TRUE) {
if(Amatch(",") || *tokenPtr == '\n' || *tokenPtr == '\0') {
break;
} else if(Amatch("F")) { // 女性名詞
*frAttrib = (FR_ATTRIB)(*frAttrib | FR_ATTRIB_FEMALE);
} else if(Amatch("M")) { // 男性名詞
*frAttrib = (FR_ATTRIB)(*frAttrib | FR_ATTRIB_MALE);
} else if(Amatch("P")) { // 集合名詞など複数形
*frAttrib = (FR_ATTRIB)(*frAttrib & (~FR_ATTRIB_SINGLE));
*frAttrib = (FR_ATTRIB)(*frAttrib | FR_ATTRIB_PLURAL);
} else if(Amatch("f")) { // 規則変化で女性形が作<れない>
*frChange = (FR_CHANGE)(*frChange & (~FR_CHANGE_FEMALE));
} else if(Amatch("d")) { // 規則変化で形容詞が作れる
*frChange = (FR_CHANGE)(*frChange | FR_CHANGE_ADJECTIVE);
} else if(Amatch("p")) { // 規則変化で複数形が作<れない>
*frChange = (FR_CHANGE)(*frChange & (~FR_CHANGE_PLURAL));
} else if(Amatch("v")) { // 規則変化で副詞が作れる
*frChange = (FR_CHANGE)(*frChange | FR_CHANGE_ADVERB);
} else {
SyntaxError();
break;
}
}
}
//
// 形容詞をload
//
void
LoadAdjectiveTable(char *fn)
{
FILE *fp;
ADJECTIVE *adjective;
fp = fopen(fn, "rt");
if((int)fp <= 0) {
PrintInternalError( "Can not open <%s>\nThis file must be in the same directory.", fn);
exit(-1);
} else {
while(TRUE) {
fgets(inputBuff, sizeof(inputBuff), fp);
if(feof(fp)) break;
tokenPtr = inputBuff;
adjective = GetAdjectiveWord();
SetAdjectiveWord(adjective);
}
}
fclose(fp);
}
ADJECTIVE
*GetAdjectiveWord(void)
{
int i;
FR_PART dummyFrPart;
JP_UNIT dummyJpUnit;
JP_KIND dummyJpKind;
FR_LOCATION dummyLocation;
ADJECTIVE *adj = (ADJECTIVE *)MyAlloc(sizeof(ADJECTIVE));
if(adj == NULL) goto MemOver;
adj->left = adj->right = NULL;
adj->french = NewString();
if(adj->french == NULL) goto MemOver;
GetFrInfo(&(adj->frAttrib), &(adj->frChange));
if(adj->frChange & FR_CHANGE_PLURAL) {
FR_CHANGE frChange = GetPluralType(adj->french);
if(frChange == FR_CHANGE_NONE) { // 単複同形名詞
adj->frAttrib = (FR_ATTRIB)(adj->frAttrib | FR_ATTRIB_PLURAL);
} else {
adj->frChange = (FR_CHANGE)(adj->frChange | frChange);
}
}
adj->proposed = CountComma(tokenPtr)/5+1;
adj->jpAdjective = (JP_ADJECTIVE*)MyAlloc(sizeof(JP_ADJECTIVE) *adj->proposed);
if(adj->jpAdjective == NULL) goto MemOver;
for(i = 0; i < adj->proposed; i++) {
adj->jpAdjective[i].pJpProp = JP_PROP_NONE;
adj->jpAdjective[i].myJpProp = JP_PROP_NONE;
adj->jpAdjective[i].location = FR_LOCATION_BEHIND;
// Parentの情報
GetJpInfo(&dummyFrPart,
&(adj->jpAdjective[i].pJpProp),
&dummyJpKind,
&dummyJpUnit,
&(adj->jpAdjective[i].location));
// Childの情報(もし、あれば)
adj->jpAdjective[i].cFrPart = FR_PART_NONE;
adj->jpAdjective[i].cJpProp = JP_PROP_NONE;
GetJpInfo(&(adj->jpAdjective[i].cFrPart),
&(adj->jpAdjective[i].cJpProp),
&dummyJpKind,
&dummyJpUnit,
&dummyLocation);
if(adj->jpAdjective[i].cJpProp == JP_PROP_NONE)
adj->jpAdjective[i].cJpProp = JP_PROP_ALL;
adj->jpAdjective[i].japanese = NewJpWord(&(adj->jpAdjective[i].jpKind));
dummyJpKind = JP_KIND_NONE;
GetJpInfo(&dummyFrPart,
&(adj->jpAdjective[i].myJpProp),
&(adj->jpAdjective[i].jpKind),
&dummyJpUnit,
&dummyLocation);
if(Amatch(",") || IsNullField())
adj->jpAdjective[i].opposite = NULL;
else
adj->jpAdjective[i].opposite = NewString();
// default settings
if(adj->jpAdjective[i].myJpProp == JP_PROP_NONE)
adj->jpAdjective[i].myJpProp = JP_PROP_CONDITION;
if(adj->jpAdjective[i].pJpProp == JP_PROP_NONE)
adj->jpAdjective[i].pJpProp = JP_PROP_ALL;
if(adj->jpAdjective[i].location == FR_LOCATION_NONE)
adj->jpAdjective[i].location = FR_LOCATION_FRONT;
}
// これ以上の候補はない
// adj->jpAdjective[i].pJpProp = JP_PROP_ALL;
return(adj);
MemOver:
PrintInternalError( "Out Of Memory!!\n");
return(NULL);
}
//
// 形容詞を辞書に登録
//
void
SetAdjectiveWord(ADJECTIVE *newAdjective)
{
if(adjectiveTable == NULL) { // 最初の単語
adjectiveTable = newAdjective;
return;
}
ADJECTIVE *p = adjectiveTable;
while(p) {
if(strcmp(newAdjective->french, p->french) < 0) {
if(p->left) { p = p->left; continue; }
else { p->left = newAdjective; break; }
} else {
if(p->right){ p = p->right; continue; }
else { p->right = newAdjective; break; }
}
}
}
//
// 副詞をload
//
void
LoadAdverbTable(char *fn)
{
FILE *fp;
fp = fopen(fn, "rt");
if((int )fp <= 0) {
PrintInternalError( "Can not open <%s>\nThis file must be in the same directory.", fn);
exit(-1);
} else {
while(TRUE) {
ADVERB *adverb;
fgets(inputBuff, sizeof(inputBuff), fp);
if(feof(fp)) break;
tokenPtr = inputBuff;
adverb = GetAdverbWord();
SetAdverbWord(adverb);
}
}
fclose(fp);
}
ADVERB
*GetAdverbWord(void)
{
int i;
ADVERB *adverb = (ADVERB *)MyAlloc(sizeof(ADVERB));
FR_PART dummyFrPart;
FR_LOCATION dummyLocation;
JP_KIND dummyJpKind;
JP_UNIT dummyJpUnit;
adverb->left = adverb->right = NULL;
adverb->french = NewString();
adverb->proposed = CountComma(tokenPtr)/4+1;
adverb->jpAdverb = (JP_ADVERB*)MyAlloc(sizeof(JP_ADVERB) * adverb->proposed);
for(i = 0; i < adverb->proposed; i++) {
adverb->jpAdverb[i].pJpProp = JP_PROP_NONE;
adverb->jpAdverb[i].myJpProp = JP_PROP_NONE;
adverb->jpAdverb[i].jpKind = JP_KIND_NONE;
GetJpInfo(&dummyFrPart,
&(adverb->jpAdverb[i].pJpProp),
&dummyJpKind,
&dummyJpUnit,
&dummyLocation);
// default settings
if(adverb->jpAdverb[i].pJpProp == JP_PROP_NONE)
adverb->jpAdverb[i].pJpProp = JP_PROP_ALL;
adverb->jpAdverb[i].japanese = NewString();
GetJpInfo(&dummyFrPart,
&(adverb->jpAdverb[i].myJpProp),
&(adverb->jpAdverb[i].jpKind),
&dummyJpUnit,
&dummyLocation);
// default settings
if(adverb->jpAdverb[i].myJpProp == JP_PROP_NONE)
adverb->jpAdverb[i].myJpProp = JP_PROP_CONDITION;
#if 0
// default settings
if(adverb->jpAdverb[i].jpKind == JP_KIND_NONE)
adverb->jpAdverb[i].jpKind = JP_KIND_ADVERB;
#endif
if(Amatch(",") || IsNullField())
adverb->jpAdverb[i].opposite = NULL;
else
adverb->jpAdverb[i].opposite = NewString();
}
// これ以上の候補はない
// adverb->jpAdverb[i].pJpProp = JP_PROP_ALL;
return(adverb);
}
//
// 形容詞を辞書に登録
//
void
SetAdverbWord(ADVERB *newAdverb)
{
if(adverbTable == NULL) { // 最初の単語
adverbTable = newAdverb;
return;
}
ADVERB *p = adverbTable;
while(p) {
if(strcmp(newAdverb->french, p->french) < 0) {
if(p->left) { p = p->left; continue; }
else { p->left = newAdverb; break; }
} else {
if(p->right){ p = p->right; continue; }
else { p->right = newAdverb; break; }
}
}
}
//
// 語尾から複数形を判定する
//
FR_CHANGE
GetPluralType(char *french)
{
int len = strlen(french);
if(french[len-1] == 's' // 単複同形名詞
|| french[len-1] == 'x'
|| french[len-1] == 'z') {
return(FR_CHANGE_NONE);
} else if(!strcmp(&french[len-3], "eau")
|| !strcmp(&french[len-2], "au")
|| !strcmp(&french[len-2], "eu")) {
return((FR_CHANGE)(FR_CHANGE_PLURAL | FR_CHANGE_PLURAL_X));
} else if(!strcmp(&french[len-2], "al")) {
french[--len] = '\0'; // 'l'と 'ux'を取り替えて複数形を作る journal -> journaux
return((FR_CHANGE)(FR_CHANGE_PLURAL | FR_CHANGE_PLURAL_AUX));
} else {
return(FR_CHANGE_PLURAL);
}
}
//
// 文字列を「,」まで切り取る + 語尾を推定 + 語尾をカット
//
char
*NewJpWord(JP_KIND *jpKind)
{
char tmp[100];
char *p = tmp;
while(*(unsigned char *)tokenPtr > ' ' && *tokenPtr != ',') {
*p++ = *tokenPtr++;
}
*p = '\0';
if(*tokenPtr == ',') tokenPtr++;
if(CmpWordTail(tmp, "いる")) *jpKind = JP_KIND_IRU;
else if(CmpWordTail(tmp, "れた")) *jpKind = JP_KIND_SHIMOICHI2_RA;
else if(CmpWordTail(tmp, "んだ")) *jpKind = JP_KIND_SHIMOICHI2_N;
else if(CmpWordTail(tmp, "した")) *jpKind = JP_KIND_SAHEN2;
else if(CmpWordTail(tmp, "い")) *jpKind = JP_KIND_KEIYOSHI;
else if(CmpWordTail(tmp, "な")) *jpKind = JP_KIND_KEIYODOSHI;
else if(CmpWordTail(tmp, "だ")) *jpKind = JP_KIND_KEIYODOSHI;
else if(CmpWordTail(tmp, "の")) *jpKind = JP_KIND_RENTAISHI;
else *jpKind = JP_KIND_NONE;
int len = strlen(tmp);
char *ret = (char *)MyAlloc(len + 1);
strncpy(ret, tmp, len);
ret[len] = '\0';
return(ret);
}
//
// 文字列を「,」まで切り取る
//
char
*NewString(void)
{
int len;
char *savPtr = tokenPtr;
char *ret;
// 単語の数を数える
while(*tokenPtr && *tokenPtr++ != ',');
len = tokenPtr - savPtr - 1;
if(len < 0) len = 0;
ret = (char *)MyAlloc(len + 1);
if(ret) {
strncpy(ret, savPtr, len);
ret[len] = '\0';
}
return(ret);
}
//
// 文字列中の「,」を数える
int
CountComma(char *s)
{
int cnt = 0;
while(*s) {
if(*s++ == ',') cnt++;
}
return(cnt);
}
//
// 文字列の語尾を比較
//
BOOL
CmpWordTail(char *s, char *t)
{
int l1 = strlen(s);
int l2 = strlen(t);
if(l1 > l2
&& !strcmp(&s[l1-l2], t)) {
s[l1-l2] = '\0';
return(TRUE);
}
return(FALSE);
}
//
//
//
BOOL
IsNullField(void)
{
switch(*tokenPtr) {
case '\0':
case '\r':
case '\n':
case ',':
return(TRUE);
default:
return(FALSE);
}
}
//
//
//
void
SyntaxError(void )
{
char lpszBuff[300];
strcpy(lpszBuff, inputBuff); // 改行文字は含まれている
char *q = &lpszBuff[strlen(inputBuff)];
for(char *p = inputBuff; p < tokenPtr; p++)
*q++ = ' ';
strcpy(q, "^ Error");
PrintInternalError(lpszBuff);
}